/**
 * Copyright (c) 2021-2028, iron.guo 郭成杰 (jiedreams@sina.com).
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.beluga.core;

import com.beluga.core.model.*;
import com.beluga.core.model.wechat.*;
import com.beluga.core.notify.WxPayRefundNotifyResult;

import java.util.Map;

/**
 * @Author iron.guo
 * @Date 2022/5/2
 * @Description
 */
public interface BPay {

    /**
     * 获取支付令牌
     * 微信、支付宝统一入口...
     * @param payModel  {@link PayModel}
     * @return {@link String}
     */
    Map<String,String> payToken(PayModel payModel);

    /**
     * 获取微信支付令牌
     * @param unifiedOrder  {@link WxBPayUnifiedOrder}
     * @return {@link WxBPayUnifiedResult}
     */
    WxPayResult.JsapiResult payToken(WxBPayUnifiedOrder unifiedOrder);

    /**
     * <pre>
     * 查询订单.
     * 详见https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2
     * 该接口提供所有微信支付订单的查询，商户可以通过查询订单接口主动查询订单状态，完成下一步的业务逻辑。
     * 需要调用查询接口的情况：
     * ◆ 当商户后台、网络、服务器等出现异常，商户系统最终未接收到支付通知；
     * ◆ 调用支付接口后，返回系统错误或未知交易状态情况；
     * ◆ 调用被扫支付API，返回USERPAYING的状态；
     * ◆ 调用关单或撤销接口API之前，需确认支付状态；
     * 接口地址：https://api.mch.weixin.qq.com/pay/orderquery
     * </pre>
     *
     * @param transactionId 微信订单号
     * @param outTradeNo    商户系统内部的订单号，当没提供transactionId时需要传这个。
     * @return the wx pay order query result
     */
    WxBPayOrderQuery queryWxOrder(String transactionId, String outTradeNo);


    /**
     * <pre>
     * 关闭订单.
     * 应用场景
     * 以下情况需要调用关单接口：
     * 1. 商户订单支付失败需要生成新单号重新发起支付，要对原订单号调用关单，避免重复支付；
     * 2. 系统下单后，用户支付超时，系统退出不再受理，避免用户继续，请调用关单接口。
     * 注意：订单生成后不能马上调用关单接口，最短调用时间间隔为5分钟。
     * 接口地址：https://api.mch.weixin.qq.com/pay/closeorder
     * 是否需要证书：   不需要。
     * </pre>
     *
     * @param outTradeNo 商户系统内部的订单号
     * @return the wx pay order close result
     */
    WxBPayOrderCloseResult closeWxOrder(String outTradeNo);


    /**
     * <pre>
     * 微信支付-申请退款.
     * 详见 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4
     * 接口链接：https://api.mch.weixin.qq.com/secapi/pay/refund
     * </pre>
     *
     * @param request 请求对象
     * @return 退款操作结果 wx pay refund result
     */
    WxBPayRefundResult wxRefund(WxBPayRefundRequest request);


    /**
     * 解析退款结果通知
     * 详见https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_16&index=9
     *
     * @param xmlData the xml data
     * @return the wx pay refund notify result
     */
    WxPayRefundNotifyResult parseWxRefundNotifyResult(String xmlData);

    /**
     * <pre>
     * 微信支付-查询退款.
     * 应用场景：
     *  提交退款申请后，通过调用该接口查询退款状态。退款有一定延时，用零钱支付的退款20分钟内到账，
     *  银行卡支付的退款3个工作日后重新查询退款状态。
     * 详见 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_5
     * 接口链接：https://api.mch.weixin.qq.com/pay/refundquery
     * </pre>
     * 以下四个参数四选一
     * @param ###
     *  transactionId 微信订单号
     *  outTradeNo    商户订单号
     *  outRefundNo   商户退款单号
     *  refundId      微信退款单号
     * @return 退款信息 wx pay refund query result
     */
    WxBPayRefundQueryResult refundQuery(WxBPayRefundQueryRequest request);


}
